<?php
	
	#Codigo de Pesquisa do GRID : NAO MEXER!
	if (isset($_GET['acao'])){
		if ($_GET['acao'] == 'grid'){
			$_POST['btnAcao']='Pesquisar';
			$_POST['ddlCampo']=$_GET['campo'];
			$_POST['ddlOperador']=$_GET['operador'];
			$_POST['txtValor']=$_GET['valor'];
		}
	}
	
	#Codigo de Pesquisa referente a ação do botao pesquisar
	$formPesquisa = array();	
	if (isset($_POST['btnAcao']) and ($_POST['btnAcao'] =='Pesquisar')){
	    foreach ($_POST as $key => $value){
	        $pesquisa = array();
	        if (strpos($key, 'fil_') !== FALSE and (!empty($value)) ){
	            //Quando o nome do campo tem espaços a pesquisa (POST) altera os espaços por underline, estamos voltando para espaços.
	            $pesquisa['campo'] = str_replace('_',' ',substr($key,4,strlen($key)));
	            $pesquisa['valor'] = strtoupper($value);
	            $formPesquisa[] = $pesquisa;
	        }        
	    }
	}
	else{
	    foreach ($_GET as $key => $value){
	        $pesquisa = array();
	        if (strpos($key, 'fil_') !== FALSE and (!empty($value)) ){
	            //Quando o nome do campo tem espaços a pesquisa (POST) altera os espaços por underline, estamos voltando para espaços.
	            $pesquisa['campo'] = str_replace('_',' ',substr($key,4,strlen($key)));
	            $pesquisa['valor'] = strtoupper($value);
	            $formPesquisa[] = $pesquisa;
	        } 
	    }
	}
	
	include_once('../../connections/conexao.php');
	
	# Inclusão dos Models: se incluir manualmente algum model no controlador antes
	# da inclusão deste arquivo, deve-se declarar as classes incluidas atraves
	# da variavel $includeModels = array('model.class','modelTeste.class');
	$files = glob('../../model/*');
        foreach( $files as $include ){
		$flag=true;
                if(isset($includeModels)){
			foreach( $includeModels as $i ){			
				if( strpos( $include, $i ) !== FALSE )
					$flag=false;				
			}
		}
                if ($flag)
			include($include);								
		
	}
	
	# Inclusão dos Componentes
	$files = glob('../../components/*.php');
	foreach($files as $include)
		include($include);
		
	# Inclusão dos Snippets
	$files = glob('../../components/snippets/*');
	foreach($files as $include)
		include($include);
	
	# Inclusão dos Grids
	$files = glob('../../components/grids/*');
	foreach($files as $include)
		include($include);

	# Inclusão dos Workflows
	include('../../workflows/InterfaceFluxo.php');
		
	$files = glob('../../workflows/*');
	foreach($files as $include)
		include_once($include);
		
	# Listas
	require_once '../../controller/listas.php';

	# Gerenciamento de Erro
	$myError = set_error_handler('TError');
	
	# Inicialização das Variáveis ( Para evitar Warning )
    $erro = null; $sucesso = null;
    
    # Timezone
    date_default_timezone_set('America/Sao_Paulo');
    setlocale(LC_TIME,'pt_BR.UTF-8');
        
    # Inicialização da Sessão
    if(!isset($_SESSION)) session_start(); // inicia a sessão caso ainda nao tenha ocorrido
    
    #Pasta do projeto
    $pasta = pathinfo(realpath('../../'));
		
    # Versão
    $_SESSION['_versao'] = $pasta['basename'];
    
    # Verificação das variáveis de sessão do usuário logado
    if ( strstr( $_SERVER['REQUEST_URI'], 'autenticacao' ) == false )
	    if ( isset($_SESSION['usuario']) == false )
	    	header("Location: ../../view/autenticacao/autenticacao.php?method=expire");
	    else {
	    	$usuario = $_SESSION['usuario'];
	    	$perfil = new Perfil( $usuario->perfilid );
	    	$pfcid = $perfil->perfilcomportamentalid;
	    	$pfcNome = $perfil->nome;
	    }
	    
	# Permissão: 
	# Antes de incluir este arquivo no controlador deve-se criar
	# a variavel $auth onde cada elemento de auth é um array com a estrutura
	# array( 'action'=> teste, 'operacao'=> teste)
	if ( isset ( $_POST ) and isset( $_POST['btnAcao'] ) and isset($auth) ){		
		foreach($auth as $a){			    
			if ( ($a['action'] == $_POST['btnAcao']) and ($usuario->isAuthorized( $a['operacao'] ) == FALSE) ){
			    $usuario->redirectUnauthorized();
			}	
		}		
	}
	
	# Mensagens Padrão
	if ( isset ( $_GET['message'] ) ){
	    switch ( $_GET['message'] ){
	        case 'alteracao':
	            $sucesso = TMensagens::getAlteracao();
	            break;
	        case 'alteracoes':
	            $sucesso = TMensagens::getAlteracoes();
	            break;
	        case 'insercao':
	            $sucesso = TMensagens::getInsercao();
	            break;
	        case 'exclusao':
	            $sucesso = TMensagens::getExclusoes();
	            break;
	        }
	}
	
	#Verificando usuario nucleo gestor
	if(isset($pfcid) and $pfcid == PerfilComportamental::NucleoGestor){
	    if(isset($usuario) and $usuario->nucleogestorid === NULL){
	        header("Location: ../../view/autenticacao/autenticacao.php?method=nucleo");
	    }
	}
	
	# DOMPDF
	include_once '../../library/dompdf-0.5.1/dompdf_config.inc.php';
	
	/******************************** 
     * Retro-support of get_called_class() 
     * Tested and works in PHP 5.2.4 
     * http://www.sol1.com.au/ 
     ********************************/ 
    if(!function_exists('get_called_class')) { 
    function get_called_class($bt = false,$l = 1) { 
        if (!$bt) $bt = debug_backtrace(); 
        if (!isset($bt[$l])) throw new Exception("Cannot find called class -> stack level too deep."); 
        if (!isset($bt[$l]['type'])) { 
            throw new Exception ('type not set'); 
        } 
        else switch ($bt[$l]['type']) { 
            case '::': 
                $lines = file($bt[$l]['file']); 
                $i = 0; 
                $callerLine = ''; 
                do { 
                    $i++; 
                    $callerLine = $lines[$bt[$l]['line']-$i] . $callerLine; 
                } while (stripos($callerLine,$bt[$l]['function']) === false); 
                preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l]['function'].'/', 
                            $callerLine, 
                            $matches); 
                if (!isset($matches[1])) { 
                    // must be an edge case. 
                    throw new Exception ("Could not find caller class: originating method call is obscured."); 
                } 
                switch ($matches[1]) { 
                    case 'self': 
                    case 'parent': 
                        return get_called_class($bt,$l+1); 
                    default: 
                        return $matches[1]; 
                } 
                // won't get here. 
            case '->': switch ($bt[$l]['function']) { 
                    case '__get': 
                        // edge case -> get class of calling object 
                        if (!is_object($bt[$l]['object'])) throw new Exception ("Edge case fail. __get called on non object."); 
                        return get_class($bt[$l]['object']); 
                    default: return $bt[$l]['class']; 
                } 
    
            default: throw new Exception ("Unknown backtrace method type"); 
        } 
    } 
} 